package com.bjc.base.bean;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;


/**
 * 树结构VO
 * 
 * @author 许自辉
 * @date 2017年8月14日
 */
@Getter 
@Setter 
@ToString
public class TreeVO {

	private Integer id;

	private String label;

	private Integer parentId;
	
	private String parentPaths;
	/**
	 * 是目录还是code,0目录，1code
	 */
	private Integer codeFlag;

	private List<TreeVO> children;

	/**
	 * list生成树结构
	 */
	public static List<TreeVO> getTreeList(List<TreeVO> treeVOs) {
		List<TreeVO> rootTrees = new ArrayList<TreeVO>();
		for (TreeVO tree : treeVOs) {
			if (tree.getParentId() == 0) {
				rootTrees.add(tree);
			}
			for (TreeVO t : treeVOs) {
				if (t.getParentId() == tree.getId()) {
					if (tree.getChildren() == null) {
						List<TreeVO> myChildrens = new ArrayList<TreeVO>();
						myChildrens.add(t);
						tree.setChildren(myChildrens);
					} else {
						tree.getChildren().add(t);
					}
				}
			}
		}
		return rootTrees;
	}

	
	/**
	 * list生成树结构
	 */
	public static List<TreeVO> getDeptTree(List<TreeVO> treeVOs) {
		// 最后的结果
	    List<TreeVO> menuList = new ArrayList<TreeVO>();
	    // 先找到所有的一级菜单
	    for (int i = 0; i < treeVOs.size(); i++) {
	        // 一级菜单没有parentId
	        if (treeVOs.get(i).getParentId()==0) {
	            menuList.add(treeVOs.get(i));
	        }
	    }
	    // 为一级菜单设置子菜单，getChild是递归调用的
	    for (TreeVO menu : menuList) {
	        menu.setChildren(getChild(menu.getId(), treeVOs));
	    }
	    return menuList;
	}
	
	
	
	
	/**
	 * 递归查找子菜单
	 * 
	 * @param id
	 *            当前菜单id
	 * @param rootMenu
	 *            要查找的列表
	 * @return
	 */
	private static List<TreeVO> getChild(Integer id, List<TreeVO> rootMenu) {
	    // 子菜单
	    List<TreeVO> childList = new ArrayList<>();
	    for (TreeVO menu : rootMenu) {
	        // 遍历所有节点，将父菜单id与传过来的id比较
	        if (StringUtils.isNotBlank(menu.getParentId()+"")) {
	            if (menu.getParentId().equals(id)) {
	                childList.add(menu);
	            }
	        }
	    }
	    // 把子菜单的子菜单再循环一遍
	    for (TreeVO menu : childList) {// 没有url子菜单还有子菜单
	            // 递归
	          menu.setChildren(getChild(menu.getId(), rootMenu));
	    } // 递归退出条件
	    if (childList.size() == 0) {
	        return null;
	    }
	    return childList;
	}
	
	
	/**
	 * 移除空的目录
	 */
	public static void removeNullTree(List<TreeVO> rootTrees) {
		if (!CollectionUtils.isEmpty(rootTrees)) {
			//移除空的目录
			Predicate<TreeVO> predicate = (s) -> (s.children == null && s.codeFlag == 0);
			rootTrees.removeIf(predicate);

			rootTrees.forEach(s -> {
				if (s.getChildren() != null) {
					removeNullTree(s.getChildren());
					if(s.getChildren().size()==0){
						s.setChildren(null);
					}
				}
			});
			
			//移除完子目录,如果当前目录为空,酒吧当前目录页移除
			if (!CollectionUtils.isEmpty(rootTrees)) {
				Predicate<TreeVO> predicate2 = (s2) -> (s2.children == null && s2.codeFlag == 0);
				rootTrees.removeIf(predicate2);
			}
			
			
		}
	}
	
	
}
